# Обзор

В игре есть глобальная очередь событий (queue), в которой хранится текущая постройка/снос на планете.
Тип события - Build, для постройки, Demolish - для сноса.
Более подробно тут: [EngineTaskQueue](engine_task_queue.md)

Когда у пользователя активен Командир, то у него появляется возможность "складывать" новые постройки в дополнительную специальную очередь - очередь построек (build queue или по немецки bauliste).

## Детали

Формат таблицы очереди построек **buildqueue**:

| **столбец** | **SQL тип** | **описание** |
|---|---|---|
| id| INT AUTO_INCREMENT PRIMARY KEY| Порядковый номер, начинается с 1|
| owner_id | INT  | ID пользователя |
| planet_id | INT  | ID планеты |
| list_id | INT | порядковый номер внутри очереди |
| tech_id | INT | ID постройки |
| level | INT | целевой уровень |
| destroy | INT | 1 - снести, 0 - построить |
| start | INT UNSIGNED | время запуска постройки |
| end | INT UNSIGNED | время окончания строительства |

У каждой планеты своя очередь построек. Постройки строятся по порядку, в зависимости от list_id.

## Строительство построек в обычном режиме

- Пример URL для постройки: `http://uni20.ogame.de/game/index.php?page=b_building&session=cbfc8ad862b5&modus=add&techid=1&planet=1281073`
- Пример URL для сноса: `http://uni20.ogame.de/game/index.php?page=b_building&session=cbfc8ad862b5&techid=1&modus=destroy&planet=1281073`

techid: ID постройки; planet: ID планеты.

## Постройка

- Проверяется возможность строительства постройки
- Списываются ресурсы, равные стоимости постройки
- В глобальную очередь queue помещается задание типа Build, start = текущему моменту времени, end = start + длительность постройки
- В очередь построек добавляется первая постройка (list_id=1)

## Снос

- То же самое что и постройка, только тип задания Demolish

## Отмена

- Возвращаются ресурсы
- Из очереди queue удаляется событие
- Из очереди построек удаляется запись

## Завершение постройки/сноса

- Корректируется уровень постройки
- Корректируется количество полей на планете
- Пересчитывается статистика
- Из очереди queue удаляется событие
- Из очереди построек удаляется запись

Таким образом строительство построек без очереди можно представить себе как строительство с очередью, но только длина очереди равна 1.

# Строительство построек с очередью

## Добавление первой постройки

- Аналогично обычному режиму

## Добавление последующей (складывание в очередь)

- Если в очереди построек уже есть 5 заданий (с текущим), то ничего не делаем
- list_id увеличивается на 1
- В очередь построек добавляется новая запись

## Отмена текущей постройки

- Аналогично обычному режиму, но дополнительно делаются следующие шаги:
- Перебираем очередь построек:
- Проверяется возможность строительства постройки N. Если строительство невозможно, то выводим сообщение и переходим на след. шаг
- Списываются ресурсы, равные стоимости постройки N
- В глобальную очередь queue помещается задание, start = время завершения/отмены предыдущей постройки, end = start + длительность постройки

## Отмена последующей

- Удаляется запись в очереди построек
- Перебираются все последующие постройки и у построек такого же типа, как удаленная - текущий уровень уменьшается на 1

## Завершение текущей постройки

- Аналогично обычному режиму, но дополнительно делаются шаги как и у отмены текущей постройки.

# Удаление планеты

После того, как обычная планета становится "Уничтоженной" - очередь её построек удаляется.

После уничтожения луны звездой смерти - очередь построек также удаляется.

После удаления давно неактивного игрока, или аккаунта поставленного на удаления - очереди построек всех планет также удаляются.
